#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
@File Name: 序列的排列类型操作_permcomb.py
@Author: LT
@Date: 2021/9/29 18:05
# -----------------------------------------------------------------------------------------------------
@Description: 
Python内部目前没有对队列的排列组合，所以得靠自己定制
# -----------------------------------------------------------------------------------------------------
"""


def permute(list):
    """构建一个由全部可能的组合方式组成的列表"""
    if not list:                                                        # 接收任何序列
        return [list]                                                   # 返回空序列
    else:
        res = []
        for i in range(len(list)):
            """好强的切片操作，不需要记忆，知道它是通过切片实现的就行了"""
            rest = list[:i] + list[i + 1:]                              # 删除当前节点
            for x in permute(rest):                                     # 排列组合其他的节点
                res.append(list[i:i + 1] + x)                           # 把当前节点添加到前面
        return res


def subset(list, size):
    """构建一个由指定长度的子集组成的全部排列组合的列表"""
    if size == 0 or not list:                                           # 考虑顺序
        return [list[:0]]                                               # 返回空序列
    else:
        result = []
        for i in range(len(list)):
            pick = list[i:i + 1]                                        # 截取序列
            rest = list[:i] + list[i + 1:]                              # 保留[:i]部分
            for x in subset(rest, size - 1):
                result.append(pick + x)
        return result


def combo(list, size):
    """如同subset，给定长度，但结果不考虑顺序，也就是说相同元素的不同排列需要被剔除"""
    if size == 0 or not list:                                           # 不考虑顺序
        return [list[:0]]                                               # xyz == yzx
    else:
        result = []
        for i in range(0, (len(list) - size) + 1):                      # 如果还有足够剩余元素
            pick = list[i:i + 1]
            rest = list[i + 1:]                                         # 截掉 [:i] 部分
            for x in combo(rest, size - 1):
                result.append(pick + x)
        return result


if __name__ == '__main__':
    pass
